package com.yeyv.net.Web.Control.Anonymous;

import com.yeyv.net.Annotation.ControllerApi.AnonController;
import com.yeyv.net.UsefulEntity.Resp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Iterator;
import java.util.RandomAccess;

@AnonController("/utils")
public class UtilsController {

    //#region 进制转换

    /**
     * 进制转换
     *
     * @param beforeNum   转换之前的数字
     * @param beforeRadix 转换之前的进制
     * @param afterRadix  转换之后的进制
     * @return 转换为{afterRadio}之后的数字
     */
    @GetMapping("parseRadix")
    public Resp<String> parseRadix(@RequestParam String beforeNum,
                                   @RequestParam Integer beforeRadix,
                                   @RequestParam Integer afterRadix) {
        try {
            return Resp.success(Integer.toString(toDEC(beforeNum, beforeRadix), afterRadix).toUpperCase());
        } catch (RuntimeException parseError) {
            return Resp.error(
                    "Parse Error",
                    "转换错误：不应出现的字符",
                    parseError.getMessage()
            );
        }
    }

    /**
     * 将{radix}进制数字{number}转换为10进制
     *
     * @param number 需要转换的{radix}进制数字
     * @param radix  {number}的进制数
     * @return 10进制的{number}
     * @throws RuntimeException
     */
    public static int toDEC(String number, int radix) throws RuntimeException {
        char[] beforeChars = number.toCharArray();
        //32进制所有的字符
        Character[] scaleRadix = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
                'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V'
        };
        //转换为需要的进制数
        int result = 0;
        scaleRadix = Arrays.copyOf(scaleRadix, radix);
        int numLength = beforeChars.length - 1;
        for (int i = numLength; i >= 0; i--) {
            int DECNumber = findIndex(scaleRadix, beforeChars[i]);
            if (DECNumber == -1) {
                throw new RuntimeException("""
                        在%d进制中,不应出现字符%c,
                        所有有效字符:
                        %s"""
                        .formatted(radix,
                                beforeChars[i],
                                Arrays.toString(scaleRadix)));
            }
            //如果不是最后一位 需要计算radix的次方
            result += numLength - i > 0
                    ? DECNumber * Math.pow(radix, numLength - i)
                    : DECNumber;
        }
        return result;
    }

    /**
     * 查询{array}中是否含有{target},如果有返回index,否则返回-1
     *
     * @param array  需要查询{target}的数组
     * @param target 需要查询的T
     * @return index || -1
     */
    public static <T> int findIndex(T[] array, T target) {
        for (int i = 0; i < array.length; i++) {
            if (target instanceof String str && array instanceof String[] arr) {
                if (str.equalsIgnoreCase(arr[i])) {
                    return i;
                }
            } else if (target instanceof Character str && array instanceof Character[] arr) {
                if (str.toString().equalsIgnoreCase(String.valueOf(arr[i]))) {
                    return i;
                }
            } else {
                if (array[i].equals(target)) {
                    return i;
                }
            }

        }
        return -1;
    }
    //#endregion

    //#region ParseJson

    //#endregion

    //#region 其它
    //#endregion
}
